package org.linlinjava.litemall.wx.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.xxl.sso.core.conf.Conf;
import com.xxl.sso.core.user.XxlSsoUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.linlinjava.litemall.core.util.IpUtils;
import org.linlinjava.litemall.db.domain.LitemallCategory;
import org.linlinjava.litemall.db.service.LitemallCommodityService;

import org.linlinjava.litemall.wx.filter.TraceWrapper;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;


/**
 * @author: // IP拦截器。URL。Time  把/wx/commodity/list或/detail 拦截 因为改写数据库category 和commodity 所以 不管用
 * @date: 2019/12/21
 * @description:
 */
@Slf4j
public class TraceInterceptor implements HandlerInterceptor {
    @Resource
    private LitemallCommodityService litemallCommodityService;
    //拦截 商城/商品(服务)/全部   和详情

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("拦截器启动_访问地址地址是>>>>", request.getRequestURI());
           String commodityListUrl="/wx/commodity/list";
           String commodityDetailUrl="/wx/commodity/detail";
           String defaultX = "x";

        if (isJson(request)) {
            // 获取 复制那一份中的 json字符串
            String jsonParam = new TraceWrapper(request).getBodyString();
         //6项1-访问时间.2-获取用户IP-->IpUtils.getRealIP(req).3。用户设备信息-->req.getLocalName()4.。获取用户的ID...

            String reqUserId;
            //如果登录：设置用户名。
        if (null != request.getAttribute(Conf.SSO_USER)) {
            reqUserId = ((XxlSsoUser) request.getAttribute(Conf.SSO_USER)).getUserid();
            }
          // 未登录或其他情况 记录为"x"
            else{reqUserId = defaultX ; }
            //1.时间 2.IP地址  3.用户设备信息 4reqUserId 用户ID
        String resLog = LocalDateTime.now() + "_" + IpUtils.getRealIP(request) + "_" + request.getLocalName() + "_" + reqUserId + "_";
            //5判断物品分类信息 categoryPid大类 categoryId小类
            //获取访问路径 /wx/commodity/list
            String accessPath = request.getServletPath();
            //如果以这些开头的，那么拿分类信息
            //旧的用这个.
            if (accessPath.equals(commodityListUrl)) {
            //如拿到大的分类信息（环境、食品）：显示
            JSONObject jsonObject = JSONObject.parseObject(jsonParam);
            Integer categoryPid = jsonObject.getInteger("categoryPid");
            //如果没有PID 则5项默认为X
            if(null == categoryPid || "".equals(categoryPid)){
                resLog = resLog + defaultX + "_" + defaultX ;
            }
            //如果有PID.则保存数据
            else{
                resLog = resLog + categoryPid.toString() + defaultX;
            }
            log.info("用户查看了>>>>>>>>>" + resLog );
        }
          //6如果是以wx/commodity/detail  商品详细  "id"就是commodity的主键ID 不是goods表的ID

            if (accessPath.equals(commodityDetailUrl)) {

                //转化成json对象
                JSONObject jsonObject = JSONObject.parseObject(jsonParam);
                String commodityId = (String) jsonObject.get("id");
                //如果有ID   拿到商品信息..
                if (StringUtils.isNotEmpty(commodityId)) {
                    //商品service中的主键ID... 去找 分类ID
                    Integer categoryIdById = litemallCommodityService.categoryIdById(Integer.valueOf(commodityId));
                    resLog = resLog  + "_" + categoryIdById + "_" + commodityId;
                    log.info("用户查看了>>>>>>>>>" + resLog );
                }
            }


//
//            /**三级分类后用这个(新)
//             * 2020.05.23因为category 分为3类.魏来重写了/wx/commodity/list 且:入参分为3类
//             * 原来 的msg>>>{"page":1,"pageSize":10,"categoryPid":"","categoryId":[],"brandId":null,"name":"","sort":""}
//             * 现在 page, pageSize,brandIdList, categoryIdL1, categoryIdL2, categoryIdL3, name , sort
//             */
//            //解析分为3类 保存  如果有3类,则不留2.1类 如果有2类,则不留1类 .没有L2 和L3则写L1
//            if (acccesPath.equals(commodityListUrl)) {
//                JSONObject jsonObject = JSONObject.parseObject(jsonParam);
//                Integer categoryIdL1 = jsonObject.getInteger("categoryIdL1");
//                Integer categoryIdL2 = jsonObject.getInteger("categoryIdL2");
//                Integer categoryIdL3 = jsonObject.getInteger("categoryIdL3");
//                //  如果L3不为空 , 5项为 categoryIdL3
//                if (null != categoryIdL3 && ! "".equals(categoryIdL3)) {
//                    resLog = resLog + categoryIdL3 + "_" + defaultX ;
//                    log.info("用户查看了>>>>>>>>>" + resLog );
//                } //L3 空就找L2
//                else {
//                    //如果L2不为空 ,  5项为 categoryIdL2
//                    if (null != categoryIdL2 && !"".equals(categoryIdL2)) {
//                        resLog = resLog + categoryIdL2 + "_" + defaultX ;
//                        log.info("用户查看了>>>>>>>>>" + resLog);
//                    }
//                    //如果L2 空,   5项为 categoryIdL1
//                    else {
//                        if(null != categoryIdL1 && !"".equals(categoryIdL1)){
//                            //如果L1不为空,
//                            resLog = resLog + categoryIdL1 + "_" + defaultX ;
//                            log.info("用户查看了>>>>>>>>>" + resLog );
//                        }else{ //如果L1为空..基本不会出现.但是如果出现..5.6项目为 X
//                            log.info("用户查看了>>>>>>>>>" + resLog );
//                        }
//                    }
//                }
//            }
//            //6如果是以wx/commodity/detail  商品详细  "id"就是commodity的主键ID
//            if (acccesPath.equals(commodityDetailUrl)) {
//                //转化成json对象
//                JSONObject jsonObject = JSONObject.parseObject(jsonParam);
//                String commodityId = (String) jsonObject.get("id");
//                log.info("用户查看了>>>>>>>>>" + resLog + "_" + commodityId);
//            }

        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

    /**
     * 判断本次请求的数据类型是否为json
     * @param request request
     * @return boolean
     *   //  String APPLICATION_JSON_VALUE = "application/json";
     *  //   MediaType APPLICATION_JSON_UTF8 = "application/json;charset=UTF-8";
     */
    private boolean isJson(HttpServletRequest request) {
        if (request.getContentType() != null) {
            return request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE) ||
                    request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE);
        }
        return false;
    }
}

